home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_std / bit_n.e < prev    next >
Text File  |  1998-12-22  |  8KB  |  314 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://www.loria.fr/SmallEiffel
  11. --
  12. expanded class BIT_N
  13. --
  14. -- Indexed Bit sequences of length `N'. This class is a template,
  15. -- not a real class; to obtain a meaningful class, replace `N' 
  16. -- with a positive integer throughout.
  17. -- 
  18. -- An INTEGER index can be used to access each bit of the sequence.
  19. -- The leftmost bit has index 1 and the rightmost bit has index `N'.
  20. --
  21. -- Note 1 : corresponding C mapping depends on actual `N' and is 
  22. --        PLATFORM dependant (see class PLATFORM).
  23. --        When `N' is in range [0  .. Character_bits], C type 
  24. --        is a simple "unsigned char".
  25. --        When `N' is in range [Character_bits+1 .. Integer_bits],
  26. --        C type is "unsigned".
  27. --        When `N' is greater than Integer_bits, C type is C array
  28. --        of "unsigned" of the form :
  29. --                 "unsigned storage[`N' div Integer_bits]"
  30. --        The array is obviously big enough to fit with `N'. As
  31. --        for previous mapping, the left most bit (at index 1 in 
  32. --        Eiffel) is always the left most in C memory.
  33. --
  34. -- Note 2 : Eiffel BIT code is portable. Generated C code for class
  35. --        BIT may not be portable (because sizeof(int) may change).
  36. --        To produce a portable C code, you can compile your Eiffel
  37. --        code using a machine with very small sizeof(int). Also note
  38. --        that doing this may run a little bit slowly.
  39. --
  40.  
  41. inherit 
  42.    BIT_N_REF 
  43.       redefine out_in_tagged_out_memory, fill_tagged_out_memory
  44.    end;
  45.  
  46. feature {NONE}
  47.  
  48.    storage: POINTER;
  49.      -- The beginning of the storage zone (first byte
  50.      -- contains the beginning of the sequence).
  51.  
  52. feature -- Basic Accessing :
  53.    
  54.    count: INTEGER is
  55.      -- Number of bits in the sequence (the value of `N').
  56.       external "SmallEiffel"
  57.       end;
  58.  
  59.    item(idx: INTEGER): BOOLEAN is
  60.      -- True if i-th bit is 1, false otherwise.
  61.       require
  62.      inside_bounds: 1 <= idx and then idx <= count
  63.       external "SmallEiffel"
  64.       end;
  65.    
  66.    put(value: BOOLEAN; idx: INTEGER) is
  67.      -- Set bit `idx' to 1 if value is true, 0 otherwise.
  68.       require
  69.      inside_bounds: 1 <= idx and idx <= count
  70.       external "SmallEiffel"
  71.       ensure
  72.      value = item(idx)
  73.       end;
  74.  
  75.    put_1(idx: INTEGER) is
  76.      -- Set bit `idx' to 1.
  77.       require
  78.      inside_bounds: 1 <= idx and idx <= count
  79.       external "SmallEiffel"
  80.       ensure
  81.      item(idx)
  82.       end;
  83.  
  84.    put_0(idx: INTEGER) is
  85.      -- Set bit `idx' to 0.
  86.       require
  87.      inside_bounds: 1 <= idx and idx <= count
  88.       external "SmallEiffel"
  89.       ensure
  90.      not item(idx)
  91.       end;
  92.  
  93. feature -- Rotating and shifting :
  94.  
  95.    infix "^" (s: INTEGER): like Current is 
  96.      -- Sequence shifted by `s' positions (positive `s' shifts 
  97.          -- right, negative left; bits falling off the sequence's
  98.          -- bounds are lost).
  99.      -- See also infix "@>>" and infix "@<<".
  100.       require
  101.      s.abs < count;
  102.       do
  103.      if s >= 0 then
  104.         Result := Current @>> s;
  105.      else
  106.         Result := Current @<< -s;
  107.      end;
  108.       end;
  109.  
  110.    infix "@>>" (s: INTEGER): like Current is 
  111.      -- Sequence shifted right by `s' positions.
  112.      -- Same as infix "^" when `s' is positive (may run a little 
  113.      -- bit faster).
  114.       require
  115.          s > 0
  116.       external "SmallEiffel"
  117.       end;
  118.  
  119.    infix "@<<" (s: INTEGER): like Current is 
  120.      -- Sequence shifted left by `s' positions.
  121.      -- Same as infix "^" when `s' is negative (may run a little 
  122.          -- bit faster.
  123.       require
  124.          s > 0
  125.       external "SmallEiffel"
  126.       end;
  127.  
  128.    infix "#" (s: INTEGER): like Current is 
  129.      -- Sequence rotated by `s' positions (positive right,
  130.      -- negative left).
  131.       require
  132.      s.abs < count;
  133.       do
  134.      if s >= 0 then
  135.         Result := Current #>> s;
  136.      else
  137.         Result := Current #<< -s;
  138.      end;
  139.       end
  140.  
  141.    infix "#>>" (s: INTEGER): like Current is 
  142.      -- Sequence rotated by `s' positions right.      
  143.       require
  144.      s >= 0;
  145.      s < count
  146.       local
  147.      i: INTEGER;
  148.      bit: BOOLEAN;
  149.       do
  150.      Result := Current;
  151.      from
  152.         i := s;
  153.      until
  154.         i = 0
  155.      loop
  156.         bit := Result.item(count);
  157.         Result := Result @>> 1;
  158.         Result.put(bit,1);
  159.         i := i - 1;
  160.      end;
  161.       end;
  162.    
  163.    infix "#<<" (s: INTEGER): like Current is 
  164.            -- Sequence rotated by `s' positions left.      
  165.       require
  166.      s >= 0;
  167.      s < count
  168.       local
  169.      i: INTEGER;
  170.      bit: BOOLEAN;
  171.       do
  172.      from
  173.         i := s;
  174.         Result := Current;
  175.      until
  176.         i = 0
  177.      loop
  178.         bit := Result.item(1);
  179.         Result := Result @<< 1;
  180.         Result.put(bit,count);
  181.         i := i - 1;
  182.      end;
  183.       end;
  184.    
  185. feature -- Bitwise Logical Operators :
  186.  
  187.    infix "and" (other: like Current): like Current is
  188.      -- Bitwise `and' of Current with `other'
  189.       external "SmallEiffel"
  190.       end;
  191.  
  192.    infix "implies" (other: like Current): like Current is
  193.      -- Bitwise implication of Current with `other'
  194.       do
  195.          Result := (not Current) or other;
  196.       end;
  197.  
  198.    prefix "not": like Current is
  199.      -- Bitwise `not' of Current.
  200.       external "SmallEiffel"
  201.       end;
  202.  
  203.    infix "or" (other: like Current): like Current is
  204.      -- Bitwise `or' of Current with `other'
  205.       external "SmallEiffel"
  206.       end;
  207.  
  208.    infix "xor" (other : like Current) : like Current is
  209.      -- Bitwise `xor' of Current with `other'
  210.       external "SmallEiffel"
  211.       end;
  212.  
  213. feature -- Conversions :
  214.  
  215.    to_string: STRING is
  216.      -- String representation of bit sequence. 
  217.          -- A zero bit is mapped to '0', a one bit to '1'. 
  218.          -- Leftmost bit is at index 1 in the returned string.
  219.      --
  220.      -- Note: see `append_in' to save memory.
  221.       do
  222.      tmp_string.clear;
  223.      append_in(tmp_string);
  224.      Result := tmp_string.twin;
  225.       ensure then
  226.      Result.count = count
  227.       end;
  228.    
  229.    to_integer: INTEGER is
  230.       require
  231.          count <= Integer_bits
  232.       external "SmallEiffel"
  233.       end;
  234.  
  235.    to_character: CHARACTER is
  236.       require
  237.          count <= Character_bits
  238.       external "SmallEiffel"
  239.       end;
  240.  
  241. -- For the next RELEASE :
  242. --   to_bit_string: BIT_STRING is
  243. --      local
  244. --         i: INTEGER;
  245. --      do
  246. --         from
  247. --            !!Result.make(count);
  248. --            i := count;
  249. --         until
  250. --            i = 0
  251. --         loop
  252. --            if item(i) then
  253. --               Result.put_1(i);
  254. --            end;
  255. --            i := i - 1;
  256. --         end;
  257. --      ensure
  258. --         count = Result.count
  259. --      end;
  260.  
  261. feature -- Others :
  262.  
  263.    all_cleared: BOOLEAN is
  264.          -- Are all bits set to 0 ?
  265.       local
  266.     other: like Current;
  267.       do
  268.          Result := Current = other;
  269.       end;
  270.  
  271.    all_set: BOOLEAN is
  272.          -- Are all bits set to 1 ?
  273.       local
  274.     other: like Current;
  275.       do
  276.          Result := Current = not other;
  277.       end;
  278.  
  279. feature -- Printing :
  280.  
  281.    append_in(str: STRING) is
  282.       local
  283.      i: INTEGER;
  284.       do
  285.      from  
  286.         i := 1;
  287.      until
  288.         i > count
  289.      loop
  290.         if item(i) then
  291.            str.extend('1');
  292.         else
  293.            str.extend('0');
  294.         end;
  295.         i := i + 1;
  296.      end;
  297.       end;
  298.    
  299.    out_in_tagged_out_memory, fill_tagged_out_memory is
  300.       do
  301.      Current.append_in(tagged_out_memory);
  302.      tagged_out_memory.extend('B');
  303.       end;
  304.  
  305. feature {NONE}
  306.  
  307.    tmp_string: STRING is
  308.       once
  309.          !!Result.make(128);
  310.       end;
  311.  
  312. end -- BIT_N
  313.  
  314.